package pe.com.bbva.carga.dao.impl;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import oracle.jdbc.OracleTypes;

import org.apache.log4j.Logger;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import pe.com.bbva.carga.dao.ArchivoDAO;
import pe.com.bbva.carga.domain.Archivo;
import pe.com.bbva.util.Constantes;
import pe.com.stefanini.core.dao.GenericDAOImpl;
import pe.com.stefanini.core.exceptions.BOException;
import pe.com.stefanini.core.exceptions.DAOException;
import pe.com.stefanini.core.util.StringUtil;

@Service("archivoDAO")
public class ArchivoDAOImpl extends GenericDAOImpl<Archivo> implements ArchivoDAO{
	Logger logger = Logger.getLogger(this.getClass());
	@Autowired
	public ArchivoDAOImpl(SessionFactory sessionFactory) {
		super(sessionFactory);
	}
	
	@Override
	@SuppressWarnings("unchecked")
	public List<Archivo> findArchivos(Archivo archivo)throws BOException, DAOException {
		String where = "";
		if(archivo.getId()!= null && !archivo.getId().equals("")){
			where = where + (where==""?"":" AND ") + "id = '" + archivo.getId()+ "'";
		}
		if(archivo.getEstado()!= null && !archivo.getEstado().equals("")){
			where = where + (where==""?"":" AND ") + "estado = '" + archivo.getEstado()+ "'";
		}
		if(archivo.getFechaCargaInicial()!= null && !archivo.getFechaCargaInicial().equals("")){
			where = where + (where==""?"":" AND ") + "fechaCargaInicial = '" + archivo.getFechaCargaInicial()+ "'";
		}
		if(archivo.getFechaCargaFinal()!= null && !archivo.getFechaCargaFinal().equals("")){
			where = where + (where==""?"":" AND ") + "fechaCargaFinal = '" + archivo.getFechaCargaFinal()+ "'";
		}
		if(archivo.getIdProceso()!= null && !archivo.getIdProceso().equals("")){
			where = where + (where==""?"":" AND ") + "idProceso = '" + archivo.getIdProceso()+ "'";
		}
		if(archivo.getIdProceso()!= null && !archivo.getIdProceso().equals("")){
			where = where + (where==""?"":" AND ") + "idProceso = '" + archivo.getIdProceso()+ "'";
		}
		if(archivo.getIdProveedor()!= null && !archivo.getIdProveedor().equals("")){
			where = where + (where==""?"":" AND ") + "idProveedor = '" + archivo.getIdProveedor()+ "'";
		}
		if(archivo.getNombreArchivo()!= null && !archivo.getNombreArchivo().equals("")){
			where = where + (where==""?"":" AND ") + "nombre like '%" + archivo.getNombreArchivo()+ "%'";
		}
		if(archivo.getComentario()!= null && !archivo.getComentario().equals("")){
			where = where + (where==""?"":" AND ") + "descripcion like '%" + archivo.getComentario()+ "%'";
		}
		if(archivo.getTipo()!= null && !archivo.getTipo().equals("")){
			where = where + (where==""?"":" AND ") + "tipo = '" + archivo.getTipo()+ "'";
		}
		if(!where.equals("")){
			where = Constantes.WHERE_CLAUSE + where;
		}
		String orders = " order by fechaCreacion desc";
		List<Archivo> listaArchivos = super.executeQuery(Archivo.class,where,orders);
		return listaArchivos;
	}
	
	@Override
	@SuppressWarnings("deprecation")
	public Long ValidaCargaEnProceso() throws DAOException {
		Session hibernateSession = null;
		Connection con = null;
		CallableStatement cstmt =null;
		ResultSet rs  = null;		
		Long IdCarga=0L;
		try {
			hibernateSession = getHibernateTemplate().getSessionFactory().openSession();
			con = hibernateSession.connection();
			cstmt =con.prepareCall("{call TARGPS.TARGPSPKG.PR_TTARGPS_VALIDAR_ENPROCESO(?)}");			
			cstmt.registerOutParameter(1,oracle.jdbc.OracleTypes.VARCHAR);		
			cstmt.executeQuery();			
			IdCarga = Long.parseLong((String)cstmt.getObject(1));			
		} catch (HibernateException e) {
			logger.error(StringUtil.getStackTrace(e));
			throw new DAOException(e.getMessage());
		} catch (SQLException e) {
			logger.error(StringUtil.getStackTrace(e));
			throw new DAOException(e.getMessage());
		} catch (Exception e) {
			logger.error(StringUtil.getStackTrace(e));
			throw new DAOException(e.getMessage());
		}finally{
			try {
				if(rs!=null){
					rs.close();
				}
				if(cstmt!=null){
					cstmt.close();
				}
				hibernateSession.close();
			} catch (SQLException e) {
				throw new DAOException(e.getMessage());
			} catch (HibernateException e) {
				logger.error(StringUtil.getStackTrace(e));
				throw new DAOException(e.getMessage());
			} 
		}
		return IdCarga;
	}

	@Override
	public Integer validaArchivoProcesado(String nombreArchivo) throws DAOException {
		Session hibernateSession = null;
		Connection con = null;
		CallableStatement cstmt =null;
		ResultSet rs  = null;		
		Integer cant = 0;
		try {
			hibernateSession = getHibernateTemplate().getSessionFactory().openSession();
			con = hibernateSession.connection();
			cstmt =con.prepareCall("{call TARGPS.TARGPSPKG.PR_TARGPS_VALIDA_ARCHIVOPROC(?,?)}");			
			cstmt.registerOutParameter(1,OracleTypes.INTEGER);			
			cstmt.setString(2, nombreArchivo);
			cstmt.executeQuery();			
			cant = (Integer)cstmt.getObject(1);
		} catch (HibernateException e) {
			e.printStackTrace();
			throw new DAOException(e.getMessage());
		} catch (SQLException e) {
			e.printStackTrace();
			throw new DAOException(e.getMessage());
		} catch (Exception e) {
			e.printStackTrace();
			throw new DAOException(e.getMessage());
		}finally{
			try {
					if(rs!=null){
						rs.close();
					}
					if(cstmt!=null){
						cstmt.close();
					}
					hibernateSession.close();
				} catch (SQLException e) {
					throw new DAOException(e.getMessage());
				} catch (HibernateException e) {
					e.printStackTrace();
					throw new DAOException(e.getMessage());
				} 
		}
		
		return cant;
	}
}